Boite à outils 3 :
Une fois arrivées au stade de la bao3, nous sommes dans la situation
suivante : nous disposons de fichiers textes et XML étiquetés via
Cordial ou treetagger et nous souhaiterions désormais en extraire nos
patrons morphosyntaxiques. Pour ce faire, trois scripts, reposant sur
des méthodes différentes, nous ont été proposés.
Le premier script est celui donné par Rachid Belmouhoub. Ayant obtenu
lors de la Bao2 des documents étiquetés via treetagger et structurés
en XML, il nous est possible de baser notre rechercher de patrons sur
l’arborescence XML. Pour ce faire, le programme de Rachid
utilise un module perl XML::LibXML.
Le script fonctionne de la manière suivante :
• Le script prend deux arguments : un fichier XML
produit lors de la BAO2 et un fichier texte contenant les patrons
morphosyntaxiques que l’on souhaite extraire (par exemple : NOM PRP
NOM). Ces deux arguments rentrés dans la ligne de commande sont
enregistrés dans des variables
• On ouvre notre fichier de motifs qu’on va alors
parcourir ligne par ligne
• Une routine permet d’utiliser des chemins XPath (sub
construit_XPath), construit selon l’information que l’on souhaite
extraire. Après avoir récupéré le motif recherché, on initialise un
chemin XPath ainsi qu’un tableau dont chaque élément correspond à un
élément du motif recherché. C’est dans ce tableau que l’on reprend
ensuite les éléments pour les intégrer à notre chemin XPath. Une fois ce
chemin XPath construit, on le retourne au programme principal.
• Une seconde routine (sub extract_pattern), utilise
le chemin XPath construit lors de la première routine pour extraire
notre information de notre document XML. C’est dans cette routine que
sont créés nos fichiers de résultats, encodés en UTF8. Plus
précisément, le programme parcourt les nœuds du fichier XML qui
correspondent à notre motif.
• Une fois la seconde routine achevée, on récupère
notre fichier de résultats.
- Le second script, écrit en langage perl, est celui donné par Jean-Michel Daube. Ce script
prend également en arguments un fichier texte contenant les patrons
à extraire ainsi qu’un fichier texte étiqueté par Cordial.
• Tout d’abord, le script lit ligne par ligne le
fichier qui contient tous nos patrons et vérifie qu’il n’y a pas
d’espaces en trop entre chaque élément du motif (par exemple, on
enlèverait un blanc en trop dans NOM_ _ADJ , représenté ici par le tiret
du bas). En outre, il retire tous les retours à la ligne.
• Dans cette même boucle conditionnelle, on parcourt
notre fichier contenant notre texte étiqueté par Cordial. Chaque ligne
est stockée dans la variable $ligne.
• Tant que le programme ne rencontre pas de signe de
ponctuation forte ou faible, il coupe au signe de la tabulation
(puisque, les résultats étiquetés par Cordial ont bien la forme d’un
tableau), qui sépare chaque token. Les tokens correspondant à la classe
grammaticale sont insérés dans une liste et les tokens
correspondant à notre terme sont intégrés dans une autre liste. On
délaisse les formes lemmatisées.
• En revanche, si le programme rencontre un signe de
ponctuation forte ou faible, il imprime nos deux listes constituées
respectivement des termes et des classes grammaticales. Ces deux listes
sont ensuite transformées en scalaires via la commande join afin de
pouvoir les comparer.
• Tant que notre liste contenant nos classes
grammaticales ($pos) est égale à notre terme $terme (qui est notre motif
contenu dans notre fichier de motifs donné en argument au programme),
alors on utilise un système d’indices basé sur le blanc, l’espace comme
séparateur. On dénombre ainsi les termes se trouvant autour du blanc (le
séparateur). Une fois la comparaison faite, on peut imprimer les
tokens que nous avons extraits grâce à cette méthode.
Le dernier script est celui conçu par Serge Fleury. Il s’agit également
d’un script perl, basé sur les
expressions régulières, qui ne prend qu’un seul argument, qui
est notre fichier texte étiqueté par treetagger ou par cordial (le
script peut en effet, s’appliquer aux deux types de fichiers, il
suffit pour cela d’adapter l’expression régulière). Il faut à chaque
fois modifier le script selon le type de fichier d’entrée et le patron
morphosyntaxique qui nous intéresse.
• Le programme commence par lire ligne par ligne notre
fichier d’entrée. Chaque ligne est insérée dans une liste (@lignes).
• Shift permet de lire le premier élément de notre
liste, qui est une ligne et qui va être insérée dans une scalaire
$ligne.
• On vérifie ensuite que la ligne contenu dans notre
scalaire $ligne correspond bien à notre expression régulière :
Pour Cordial, étant donné que les lignes sont
structurées comme un tableau, pour prendre le mot qui nous intéresse, on
va demander à ce que la fin de la ligne (soit la troisième colonne,
contienne NC (la classe grammaticale des noms). Si c’est le cas, on
prendra le premier élément de notre ligne. Chaque élément est séparé par
une tabulation (\t)
Pour treetagger, l’expression régulière se base sur
les balises. Si l’on tombe sur une ligne dont la balise type est égale à
NOM, alors on prendra le contenu de la balise data. Il est important de
noter que toutes les balises de notre ligne doivent justement être bel
et bien sur une seule ligne et collées entre elles pour bien
correspondre à notre expression régulière.
• Chaque élément de notre patron morphosyntaxique est
récupéré dans $1 et rajouté au fur et à mesure dans $sequence.
• Une autre variable, $longueur, indique le nombre
d’éléments extraits. Cela nous permettra de mesurer la longueur du
patron morphosyntaxique que l’on souhaite extraire (NOM ADJ ou NOM PREP
NOM) et de la vérifier.
• Une fois les éléments de notre patron
morphosyntaxique extraits, on les imprime sur le terminal. Il est aussi
possible de modifier le programme afin qu’il les imprime dans un fichier
de sortie, comme dans le cas des programmes précédents.
• Nota bene : pour passer d’un élément de notre liste
@lignes à un autre, on utilise shift ainsi que l’indice [0]. Dès qu’on a
passé une ligne, on passe à la suivante, qui se voit attribuer cet
indice et se retrouve donc en « première position » pour être lue et
stockée par le programme.
Nous avons testé ces trois scripts et étudié leur fonctionnement. Pour
plus d’efficacité et de rapidité, il aurait été possible de rajouter à
chacun de ces scripts une routine permettant de parcourir toute
l’arborescence de notre dossier contenant les fichiers étiquetés, comme
dans le cas de nos scripts de la BAO2.